package com.kevinkk.array;

/**
 * 给定一个含有 n 个正整数的数组和一个正整数 target 。
 *
 * 找出该数组中满足其总和大于等于 target 的长度最小的子数组
 *  [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。
 *
 *  滑动窗口
 *  设置左右两个指针，代表整个滑动窗口
 *  窗口的右边不断延展，直到符合条件(sum >= target) 注意⚠️这里是有等号的
 *  这时候就开始尝试缩短窗口的左边，直到不符合条件
 *  此时再次尝试扩展窗口的右边
 *
 *  这里需要注意更新 res 结果的位置，一进入while循环就需要判断一次res的值
 *  因为如果后续缩短了窗口，就有可能导致sum不再符合要求了
 */
public class MinimumSizeSubarraySum {
    class Solution {
        public int minSubArrayLen(int target, int[] nums) {
            int res = Integer.MAX_VALUE, sum = 0;
            for(int left = 0, right = 0; right < nums.length; right++){
                sum += nums[right];
                while(sum >= target){
                    res = Math.min(res, right-left+1);
                    sum -= nums[left];
                    left ++;
                }
            }

            return res == Integer.MAX_VALUE ? 0 : res;
        }
    }
}
